/**
 * @Author: DengLibin
 * @Date: Create in 2024-10-16 14:54:05
 * @Description: 通信协议服务端
 */
package main

import (
	"crypto/tls"
	"encoding/binary"
	"fmt"
	"io"
	"log"
	"net"
	"os"
)

/**
 *@Author: DengLibin
 *@Date: Create in 2024-10-16 14:59:52
 *@Description: 处理连接
 */
func handleConnection(conn net.Conn) {
	defer conn.Close()

	for {
		// 读取消息头：1 字节的消息类型 + 4 字节的消息长度
		header := make([]byte, 5)
		_, err := io.ReadFull(conn, header)
		if err != nil {
			fmt.Println("读取消息头失败: ", err)
			return
		}

		// 解析消息类型
		msgType := header[0]

		// 解析消息长度（大端序）
		messageLength := binary.BigEndian.Uint32(header[1:5])
		log.Println("消息长度:", messageLength)

		// 根据长度读取消息内容
		messageBody := make([]byte, messageLength)
		_, err = io.ReadFull(conn, messageBody)
		if err != nil {
			fmt.Println("读取消息体失败: ", err)
			return
		}

		// 处理不同类型的消息
		switch msgType {
		case 1: // 字符串消息
			fmt.Println("收到字符串消息: ", string(messageBody))
		case 2: // 文件消息
			fmt.Println("收到文件，保存中...")
			err := saveFile("received_file", messageBody)
			if err != nil {
				log.Panicln("保存文件错误:", err)
			}
		default:
			fmt.Println("未知的消息类型")
		}
	}
}

// 保存接收到的文件
func saveFile(filename string, data []byte) error {
	file, err := os.Create(filename)
	if err != nil {
		return err
	}
	defer file.Close()

	_, err = file.Write(data)
	if err != nil {
		return err
	}

	fmt.Printf("文件已保存为 %s\n", filename)
	return nil
}

func main_server() {
	// 加载 TLS 证书
	cert, err := tls.LoadX509KeyPair("server.crt", "server.key")
	if err != nil {
		log.Fatalf("加载证书失败: %s", err)
	}
	tlsConfig := &tls.Config{Certificates: []tls.Certificate{cert}}

	// 启动 TLS 监听
	listener, err := tls.Listen("tcp", "localhost:4433", tlsConfig)
	if err != nil {
		log.Fatalf("无法监听端口: %s", err)
	}
	defer listener.Close()

	fmt.Println("TLS 服务器正在监听...")
	for {
		conn, err := listener.Accept()
		if err != nil {
			log.Println("连接接受失败: ", err)
			continue
		}
		log.Println("新的连接:", conn.RemoteAddr().String())
		go handleConnection(conn)
	}
}
